home *** CD-ROM | disk | FTP | other *** search
/ Super PC 34 / Super PC 34 (Shareware).iso / spc / UTIL / DJGPP2 / V2 / DJLSR200.ZIP / src / libc / posix / unistd / chdir.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-11-15  |  988 b   |  55 lines

  1. /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
  2. #include <libc/stubs.h>
  3. #include <unistd.h>
  4. #include <errno.h>
  5. #include <go32.h>
  6. #include <ctype.h>
  7. #include <dpmi.h>
  8. #include <libc/dosio.h>
  9.  
  10. int
  11. chdir (const char *dirname)
  12. {
  13.   __dpmi_regs r;
  14.  
  15.   if (dirname == 0)
  16.   {
  17.     errno = EINVAL;
  18.     return -1;
  19.   }
  20.  
  21.   if (dirname[0] == 0)
  22.   {
  23.     errno = ENOENT;
  24.     return -1;
  25.   }
  26.  
  27.   if (dirname[1] != ':' || dirname[2])
  28.   {
  29.     if(_USE_LFN)
  30.       r.x.ax = 0x713b;
  31.     else
  32.       r.h.ah = 0x3b;
  33.     r.x.dx = __tb_offset;
  34.     r.x.ds = __tb_segment;
  35.     _put_path(dirname);
  36.     __dpmi_int(0x21, &r);
  37.     if(r.x.flags & 1)
  38.     {
  39.       errno = __doserr_to_errno(r.x.ax);
  40.       return -1;
  41.     }
  42.   }
  43.  
  44.   if (dirname[1] == ':')
  45.   {
  46.     /* Change current drive also.  This *will* work if
  47.        the directory change above worked. */
  48.     r.h.ah = 0x0e;
  49.     r.h.dl = (dirname[0] & 0x1f) - 1;
  50.     __dpmi_int(0x21, &r);
  51.   }
  52.  
  53.   return 0;
  54. }
  55.